package br.com.erpnasajon.controle;

import br.com.erpnasajon.dao.UsuarioDao;
import br.com.erpnasajon.dao.UsuarioDaoImp;
import br.com.erpnasajon.globais.ModulosSistema;
import br.com.erpnasajon.globais.OperacoesSistema;
import br.com.erpnasajon.modelo.Acesso;
import br.com.erpnasajon.modelo.Usuario;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

/**
 *
 * @author MENDONCA
 */
@ManagedBean
@SessionScoped
public class UsuarioControle implements Serializable {

    private Usuario usuario;
    private List<Acesso> acessos;
    private UsuarioDao dao;

    private boolean buscaAcesso(ModulosSistema mod, OperacoesSistema op) {
        boolean liberar = false;
        for (int i = 0; i < acessos.size(); i++) {
            Acesso acesso = acessos.get(i);
            if ((acesso.getModulosistema() == mod.getCodigo()) && (acesso.getOperacao() == op.getCodigo())) {
                liberar = true;
                break;
            } 
        }
        return liberar;
    }

    public UsuarioControle() {
        dao = new UsuarioDaoImp();
        String login = "";
        SecurityContext context = SecurityContextHolder.getContext();
        if (context instanceof SecurityContext) {
            Authentication authentication = context.getAuthentication();
            if (authentication instanceof Authentication) {
                login = ((((User) authentication.getPrincipal()).getUsername()));
                if (!"".equals(login)) {
                    usuario = dao.buscarUsuarioPorLogin(login);
                    acessos = dao.buscarAcessosDoUsuario(usuario.getPerfilusuario());
                }
            }
        }
    }

    public boolean temAcesso(ModulosSistema modulo, OperacoesSistema operacao) {
        if (usuario == null) {
            return false;
        } else if ("ADMINISTRADORES".equals(usuario.getPerfilusuario().getNome())) {
            return true;
        } else if ((acessos != null) && (buscaAcesso(modulo, operacao))) {
            return true;
        } else {
            return false;
        }
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the acessos
     */
    public List<Acesso> getAcessos() {
        return acessos;
    }

    /**
     * @param acessos the acessos to set
     */
    public void setAcessos(List<Acesso> acessos) {
        this.acessos = acessos;
    }
}
